home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <stdio.h>
- #include <conio.h>
- #include <graphics.h>
- #include <io.h>
- #include <malloc.h>
- #include <string.h>
- #include <math.h>
-
-
- #define BUFFERSIZE 128*128
-
-
- void main(int argc, char **argv)
- {
- int i,j,k,l;
- FILE *in;
- int startgray;
- int grays;
- short buffer[BUFFERSIZE];
- int filesize;
- int bpf; /* buffers per file */
- unsigned int *histogram;
- int grdriver, grmode, grerror;
- float avg, temp;
- unsigned short disp[512];
- int ratio;
- char ticks[15];
- int tw;
-
-
- /* Ensure proper syntax */
-
- if(argc != 4)
- {
- printf("Usage:: hist12 filename startgray numgray.\n\n");
- exit(1);
- }
-
- startgray = atoi(argv[2]);
- grays = atoi(argv[3]);
-
- switch(grays)
- {
- case 4096:
- case 2048:
- case 1024:
- case 512:
- case 256:
- case 128:
- case 64:
- case 32:
- break;
-
- default:
- printf("\nPlease use a power of 2 (128, 256, etc.)\n");
- printf("for the number of gray values.\n\n");
- exit(2);
- }
-
-
- /* Allocate histogram storage space */
-
- histogram = (unsigned int *)malloc(grays * sizeof(int));
- if(histogram == NULL)
- {
- printf("\nMemory allocation error.\n");
- exit(3);
- }
-
-
- /* open input file */
-
- in = fopen(argv[1], "rb");
- if(in == NULL)
- {
- printf("Can not open file: %s.\n\n", argv[1]);
- exit(4);
- }
-
-
- /* Clear the histogram */
-
- for(i=0; i<grays; i++)
- histogram[i] = 0;
-
-
- /* Determine the number of disk reads needed */
-
- filesize = filelength( fileno(in) );
- bpf = filesize / sizeof(buffer);
-
-
- /* Calculate the histogram */
-
- for(i=0; i<bpf; i++)
- {
- fread(buffer, sizeof(buffer), 1, in);
-
- for(j=0; j<BUFFERSIZE; j++)
- {
- if(buffer[j] >= startgray)
- if(buffer[j] < startgray + grays)
- histogram[ buffer[j] - startgray]++;
- }
- }
-
- fclose(in);
-
-
- /* check graphics hardware */
-
- grdriver = DETECTX;
- grmode = 0;
- detectgraph(&grdriver, &grmode);
- switch(grdriver)
- {
- case VESA256:
- case ATI256:
- case COMPAQ:
- case TSENG3256:
- case TSENG4256:
- case GENOA5:
- case GENOA6:
- case OAK:
- case PARADIS256:
- case TECMAR:
- case TRIDENT256:
- case VIDEO7:
- case VIDEO7II:
- break;
-
- default:
- printf("Unable to detect 256 color graphics adapter.\n");
- exit(5);
- break;
- }
-
-
- grmode = 1;
- initgraph(&grdriver, &grmode, "");
- grerror = graphresult();
- if(grerror)
- {
- closegraph();
- printf("Error %d initializing graphics mode.\n", grerror);
- exit(6);
- }
-
-
- /* get the average histogram value */
-
- avg = 0.0;
- j = 0;
-
- for(i=0; i<grays; i++)
- {
- avg += (float)histogram[i];
- if(histogram[i] != 0)
- j++;
- }
-
- avg = avg/(float)j;
-
-
- /* setup display array */
-
- if(grays >= 512)
- {
- ratio = grays/512;
-
- for(i=0; i<512; i++)
- {
- temp = 0.0;
- for(j=0; j<ratio; j++)
- temp += (float)histogram[i*ratio + j] / (float)ratio;
- k = (int)floor( (double)(temp / avg * 200.0));
- if(k > 400)
- k = 400;
- disp[i] = k;
- }
- }
- else
- {
- ratio = 512/grays;
-
- for(i=0; i<grays; i++)
- {
- k = (int)floor( (double)(histogram[i] / avg * 200.0));
- if(k > 400)
- k = 400;
- for(j=0; j<ratio; j++)
- disp[i*ratio + j] = k;
- }
- }
-
-
- /* display background */
-
- setbkcolor(31); /* white */
- cleardevice();
-
- setcolor(0);
- rectangle(63,39, 640-64,480-39);
-
-
- /* display histogram */
-
- setcolor(1); /* blue */
- for(i=0; i<512; i++)
- line(64+i, 440, 64+i, 440 - disp[i]);
-
-
- /* display tick marks and title */
-
- setcolor(0);
- for(i=0; i<=8; i++)
- {
- sprintf(ticks, "%d", i*grays/8 + startgray);
- tw = textwidth(ticks);
- outtextxy(64*(i+1)-tw/2+1, 450, ticks);
- line(64*(i+1), 441, 64*(i+1), 444);
- }
-
- tw = textwidth(argv[1]);
- outtextxy(320-tw/2+1, 20, argv[1]);
-
-
- /* wait for keystrike then exit */
-
- getch();
-
- closegraph();
- free( (void *)histogram);
- }
-